/*********************************************************************************************
	Fichier: NCURSESFonctions.c
	Pour pouvoir jouer au Tetris sur l'interface texte, nous avons besoin des fonctions suivantes. 
**********************************************************************************************/

#include "NCURSESFonctions.h"


/*Fonctions principales*/

void NCURSESDeplacerPiece(Jeu * j)
{

	while ( JeuGetEtat(j) == JEU )
	{
		NCURSESAfficherJeu(j);/* affichage du jeu */
		timeout((40-JeuGetNiveau(j)) * 10);
		int touche = getch();

		switch(touche)
		{
			case ESCAPE_KEY: JeuSetEtat(j, QUIT); /* la touche Echap du clavier, permet de quitter le jeu */
				break;
			case KEY_DOWN: while (JeuActionClavier(j, 'b')){NCURSESAfficherJeu(j);}return ; /*la fleche du bas, permet à la piece de descendre d'un coup,  */
				break;
			case KEY_UP: JeuActionClavier(j, 'p');  /*la fleche du haut permet la rotation de la piece  */
                            break;
			case KEY_LEFT:JeuActionClavier(j, 'g'); /*la fleche gauche permet à la piece de se deplacer à gauche */
                            break;
			case KEY_RIGHT:JeuActionClavier(j, 'd');  /* la fleche droite permet à la piece de se deplacer à droite */
                            break;
			case ERR: if ( ! JeuActionClavier(j, 'b') ){return;} /*si rien n'a été fait ,la piece descend automatiquement*/
				break;
			default:
				break;
		}

	}

}

void NCURSESAfficherJeu(Jeu * j)
{

	NCURSESAfficherTitre();/* affiche le titre dans l'interface */
	NCURSESAfficherSuivante(j);/* affiche la pièce suivante dans l'interface */
	NCURSESAfficherScore(j);/* affiche le score dans l'interface */
        NCURSESAfficherNiveau(j);/* affiche le niveau dans l'interface */
	NCURSESAfficherTerrain(j);/* affiche le terrain dans l'interface */
	refresh();
}

/*Fonctions de démarrage et de fermeture*/

void NCURSES_INIT(void)/* 1ere fonction qui fait appelle à l'execution du programme */
{
	initscr(); /* démarrage de ncurses */
	raw(); /* on veut avoir tous les évènements clavier  */
	noecho(); /* sert à arrêter l'affichage des caractères tapé au clavier */
	keypad(stdscr, TRUE); /* sert à activer l'usage des touches de fonction pour la fenêtre stdscr */
}

void NCURSES_STOP(void)
{
	endwin(); /* on ferme le module */
}




/*Sous-Fonctions*/

void NCURSESAfficherTerrain(Jeu * j)
{
	/* on se positionne là où on veut créer le terrain, position définie dans le .h */
	move(PositionTerrainX,PositionTerrainY);
	/* on recopie la fonction d'affichage de terrain adaptée pour ncurses */
	int i;
	int k;
	for ( k = 0 ; k < TAILLE_Y ; k++) /* on parcours le terrain */
	{
		move(PositionTerrainX+k,PositionTerrainY);
		printw("!");/* on délimite notre terrain avec les "!". */
		for ( i = 0 ; i < TAILLE_X ; i++)
		{
			if ( j->terrain->ter[i][k] == NULL ) printw(" !");/* ainsi qu'a l'interieure du terrain.*/
			else printw("%d!",(((j->terrain)->ter[i][k])->couleur));
		}
	}
}

void NCURSESAfficherTitre(void)
{
	/* on se positionne là où on veut placer le titre, position definie dans le .h */
	move(positionTitreX,positionTitreX);
	printw("\t*Le Tetris Clone*");/* affiche le titre. */
}



void NCURSESAfficherNiveau(Jeu * j)
{
	/* on se positionne là où on veut positionner le niveau, position definie dans le .h */
	move(positionNiveauX, positionNiveauY);
	printw("Niveau %d", j->niveau);/* affiche le niveau */
}


void NCURSESAfficherScore(Jeu * j)
{
	/* on se positionne là où on veut positionner le score, position definie dans le .h */
	move(positionScoreX, positionScoreY);
	printw("Score : %d", j->score);/* on affiche le score */
}





void NCURSESAfficherSuivante(Jeu * j)

{
	/* on se positionne là où on veut la pièce suivante, position definie dans le .h */
	move(positionSuivanteX, positionSuivanteY);
	printw("Pièce Suivante :");/* affiche le score. */

	Piece * p = j->suivante;
	int x,y;
	for ( x = 0 ; x < MAX_TAILLE_PIECE_X ; x++ )
	{
		for ( y = 0 ; y < MAX_TAILLE_PIECE_Y ; y++ )
		{
                if ( p->forme[x][y] == 1 )
                {
                    move(positionSuivanteX + x+1,positionSuivanteY + y+1);
                    printw("*");
                }
		}
	}
}



/* Fonction pour faire tourner le jeu */

int main(int argc, char *argv[])
{
	Jeu * j; /* Déclaration du Jeu j*/
	j = JeuCreer();/* Création du Jeu */
	JeuInitialiser(j);/* Initialisation du Jeu */


	NCURSES_INIT();/* Démarrage de NCURSES */

	JeuSetEtat(j, JEU);/* Modification de l'etat du jeu */
	while ( JeuGetEtat(j) < PERDU )/* tant qu'on à pas perdu on continu de jouer */
	{
		NCURSESAfficherJeu(j);/* Affichage dujeu */
		JeuNouvellePiece(j);/* Création d'une nouvelle pièce */
		NCURSESAfficherJeu(j);/* Affiche à nouveau le jeu */
		NCURSESDeplacerPiece(j);/* On déplace la pièce */
		while ( JeuEffacerLignesPleine(j) == 1) /* tant qu'on a des lignes pleines à effacer */
			{
				while ( JeuFaireTomberToutesPieces(j) == 1 ) /* tant que le terrain n'est pas pleins */
				{
					NCURSESAfficherJeu(j); /*! on rafraichit l'ecran */
				}
			}
	}




	NCURSES_STOP();/* Fermeture de module */
	JeuDetruire(j);/* On détruit Jeu */


	return EXIT_SUCCESS;/*! fermeture du programme */
}
